/******************************************************************************* * Copyright (c) 2010 EclipseSource and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.rap.ui.internal.application; import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.app.IApplication; import org.eclipse.rap.ui.internal.servlet.EntryPointExtension; import org.eclipse.rwt.internal.lifecycle.EntryPointManager; import org.eclipse.ui.internal.WorkbenchPlugin; import org.osgi.framework.Bundle; /* * Registers all available applications as entrypoints. */ public final class ApplicationRegistry { private static final String RUN = "run"; //$NON-NLS-1$ private static final String PI_RUNTIME = "org.eclipse.core.runtime"; //$NON-NLS-1$ private static final String PT_APPLICATIONS = "applications"; //$NON-NLS-1$ private static final String PT_APP_VISIBLE = "visible"; //$NON-NLS-1$ private static Map appEntrypointMapping = new HashMap(); public static IApplication getApplication() { IApplication application = null; String currentEntryPoint = EntryPointManager.getCurrentEntryPoint(); Class clazz = ( Class )appEntrypointMapping.get( currentEntryPoint ); try { application = ( IApplication )clazz.newInstance(); } catch( final InstantiationException e ) { e.printStackTrace(); } catch( final IllegalAccessException e ) { e.printStackTrace(); } return application; } private static void registerApplication( final IExtension extension ) { IConfigurationElement configElement = extension.getConfigurationElements()[0]; String contributorName = configElement.getContributor().getName(); IConfigurationElement[] runElement = configElement.getChildren( RUN ); String className = runElement[ 0 ].getAttribute( "class" ); //$NON-NLS-1$ String applicationId = extension.getUniqueIdentifier(); String applicationParameter = extension.getSimpleIdentifier(); String isVisible = configElement.getAttribute( PT_APP_VISIBLE ); try { // ignore invisible applications if( isVisible == null || Boolean.valueOf( isVisible ).booleanValue() ) { Bundle bundle = Platform.getBundle( contributorName ); Class clazz = bundle.loadClass( className ); appEntrypointMapping.put( applicationParameter, clazz ); EntryPointManager.register( applicationParameter, EntrypointApplicationWrapper.class ); EntryPointExtension.bind( applicationId, applicationParameter ); } } catch( final ClassNotFoundException e ) { String text = "Could not register application ''{0}'' " //$NON-NLS-1$ + "with request startup parameter ''{1}''."; //$NON-NLS-1$ Object[] params = new Object[]{ className, applicationParameter }; String msg = MessageFormat.format( text, params ); IStatus status = new Status( IStatus.ERROR, contributorName, IStatus.OK, msg, e ); WorkbenchPlugin.getDefault().getLog().log( status ); } } public static void registerApplicationEntryPoints() { IExtension[] elements = getApplicationExtensions(); for( int i = 0; i < elements.length; i++ ) { registerApplication( elements[ i ] ); } } private static IExtension[] getApplicationExtensions() { IExtensionRegistry registry = Platform.getExtensionRegistry(); String extensionPointId = PI_RUNTIME + '.' + PT_APPLICATIONS; IExtensionPoint extensionPoint = registry.getExtensionPoint( extensionPointId ); return extensionPoint.getExtensions(); } private ApplicationRegistry() { // prevent instantiation } }